home *** CD-ROM | disk | FTP | other *** search
/ Dynamic HTML Construction Kit / Dynamic HTML Construction Kit.iso / earthlink / nscomm / java40.jar / netscape / applet / EmbeddedObject.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-11-03  |  10.1 KB  |  527 lines

  1. package netscape.applet;
  2.  
  3. import java.net.MalformedURLException;
  4. import java.net.URL;
  5. import netscape.application.CommandEvent;
  6. import netscape.application.FormElement;
  7. import netscape.application.FoundationPanel;
  8. import netscape.application.Target;
  9. import netscape.security.AppletSecurityException;
  10. import netscape.util.Hashtable;
  11. import netscape.util.InconsistencyException;
  12.  
  13. class EmbeddedObject implements Target {
  14.    IntTable beans;
  15.    int parentContext;
  16.    int frameContext;
  17.    int contextID;
  18.    int objectID;
  19.    URL documentURL;
  20.    URL codebaseURL;
  21.    URL archiveURL;
  22.    int width;
  23.    int height;
  24.    String programName;
  25.    String className;
  26.    Hashtable attribs;
  27.    Hashtable params;
  28.    static final int OBJECT_TYPE_BEAN = 0;
  29.    static final int OBJECT_TYPE_PROG_EXPLICIT = 1;
  30.    static final int OBJECT_TYPE_PROG_DEFAULT = 2;
  31.    static final int OBJECT_TYPE_PROG_JAVASCRIPT = 3;
  32.    int objectType;
  33.    EmbeddedBeanTracker beanTracker;
  34.    EmbeddedProgramTracker programTracker;
  35.    Object actualObject;
  36.    EmbeddedObjectFrame frame;
  37.    FoundationPanel panel;
  38.    Task task;
  39.    EmbeddedProgramTaskOwner taskOwner;
  40.    static final int OBJECT_CREATED = 0;
  41.    static final int OBJECT_INITIALIZED = 1;
  42.    static final int OBJECT_STARTED = 2;
  43.    static final int OBJECT_STOPPED = 3;
  44.    static final int OBJECT_DESTROYED = 4;
  45.    int state;
  46.    static EmbeddedBeanOwner defaultBeanOwner = new DefaultEmbeddedOwner();
  47.    static EmbeddedProgramOwner defaultProgramOwner;
  48.    EmbeddedBeanOwner beanOwner;
  49.  
  50.    int width() {
  51.       return this.width;
  52.    }
  53.  
  54.    int height() {
  55.       return this.height;
  56.    }
  57.  
  58.    URL documentURL() {
  59.       return this.documentURL;
  60.    }
  61.  
  62.    URL codebaseURL() {
  63.       return this.codebaseURL;
  64.    }
  65.  
  66.    URL archiveURL() {
  67.       return this.archiveURL;
  68.    }
  69.  
  70.    Hashtable attributes() {
  71.       return this.attribs;
  72.    }
  73.  
  74.    Hashtable parameters() {
  75.       return this.params;
  76.    }
  77.  
  78.    Object getActualObject() {
  79.       return this.objectType != 0 ? this.task.application() : this.actualObject;
  80.    }
  81.  
  82.    String getText() {
  83.       return this.actualObject instanceof FormElement ? ((FormElement)this.actualObject).formElementText() : null;
  84.    }
  85.  
  86.    IntTable beans() {
  87.       return this.beans;
  88.    }
  89.  
  90.    static EmbeddedObject registerBean(EmbeddedObject var0) {
  91.       EmbeddedObject var1 = var0.taskOwner.getProgramForBean(var0);
  92.       var1.beans.put(var0.objectID, var0);
  93.       return var1;
  94.    }
  95.  
  96.    static EmbeddedObject unregisterBean(EmbeddedObject var0) {
  97.       EmbeddedObject var1 = var0.taskOwner.getProgramForBean(var0);
  98.       var1.beans.remove(var0.objectID);
  99.       return var1;
  100.    }
  101.  
  102.    static void initObject(int var0, int var1, int var2, int var3, String[] var4, int var5, boolean var6) {
  103.       URL var16;
  104.       try {
  105.          var16 = new URL(var4[0]);
  106.       } catch (MalformedURLException var27) {
  107.          EmbeddedObjectNatives.pMochaOnLoad(var1, -1);
  108.          return;
  109.       }
  110.  
  111.       Hashtable var15 = new Hashtable();
  112.       Hashtable var14 = new Hashtable();
  113.       var14.put("document", var4[0]);
  114.  
  115.       for(int var7 = 1; var7 < var4.length; ++var7) {
  116.          String var11 = var4[var7];
  117.          int var8 = var11.indexOf(61);
  118.          if (var8 >= 0) {
  119.             if (var7 < var5) {
  120.                String var20 = var11.substring(0, var8).toLowerCase();
  121.                var14.put(var20, var11.substring(var8 + 1));
  122.                if (var20.equals("name")) {
  123.                   var14.put("id", var11.substring(var8 + 1));
  124.                }
  125.             } else {
  126.                var15.put(var11.substring(0, var8).toLowerCase(), var11.substring(var8 + 1));
  127.             }
  128.          }
  129.       }
  130.  
  131.       URL var17 = computeCodebase(var16, var14);
  132.       URL var18 = computeArchive(var17, var14, var15);
  133.  
  134.       int var9;
  135.       try {
  136.          var9 = Integer.parseInt((String)var14.get("width"));
  137.       } catch (NumberFormatException var26) {
  138.          var9 = 50;
  139.       }
  140.  
  141.       int var10;
  142.       try {
  143.          var10 = Integer.parseInt((String)var14.get("height"));
  144.       } catch (NumberFormatException var25) {
  145.          var10 = 50;
  146.       }
  147.  
  148.       String var13 = (String)var14.get("code");
  149.       if (var13 == null) {
  150.          throw new Error("CLASSID was not specified for OBJECT tag.");
  151.       } else {
  152.          String var12 = (String)var15.get("program name");
  153.          if (var12 == null) {
  154.             var12 = var4[0] + "_" + var2;
  155.          }
  156.  
  157.          Task var19 = Task.taskNamed(var17, var12);
  158.          if (var19 == null) {
  159.             Hashtable var21;
  160.             Hashtable var22;
  161.             byte var23;
  162.             int var24;
  163.             String var28;
  164.             if (var6) {
  165.                var28 = var13;
  166.                var21 = var14;
  167.                var22 = var15;
  168.                var23 = 1;
  169.                var24 = var3;
  170.             } else {
  171.                var28 = "netscape.application.Application";
  172.                var21 = new Hashtable();
  173.                var22 = new Hashtable();
  174.                var23 = 2;
  175.                var24 = 0;
  176.             }
  177.  
  178.             new EmbeddedObject(var0, var1, var2, var24, var16, var17, var18, 0, 0, var12, var28, var21, var22, var23);
  179.             if (var6) {
  180.                return;
  181.             }
  182.          }
  183.  
  184.          if (var6) {
  185.             new EmbeddedObject(var0, var1, var2, var3, var16, var17, var18, 0, 0, var12, (String)null, var14, var15, 1);
  186.          } else {
  187.             new EmbeddedObject(var0, var1, var2, var3, var16, var17, var18, var9, var10, var12, var13, var14, var15, 0);
  188.          }
  189.       }
  190.    }
  191.  
  192.    static URL computeCodebase(URL var0, Hashtable var1) {
  193.       String var2 = (String)var1.get("document");
  194.       String var3 = (String)var1.get("codebase");
  195.       if (var3 == null) {
  196.          int var4 = var2.lastIndexOf(47) + 1;
  197.          var3 = var2.substring(0, var4);
  198.       } else {
  199.          if (!var3.endsWith("/")) {
  200.             var3 = var3 + "/";
  201.          }
  202.  
  203.          try {
  204.             URL var8 = new URL(var0, var3);
  205.             var3 = var8.toString();
  206.             int var5 = var3.lastIndexOf(47) + 1;
  207.             if (var5 != var3.length() - 1) {
  208.                var3 = var3.substring(0, var5);
  209.             }
  210.          } catch (MalformedURLException var7) {
  211.          }
  212.  
  213.          if (!var2.startsWith("file:") && var3.startsWith("file:")) {
  214.             throw new AppletSecurityException("EmbeddedObject: Can't use file:// URL in CODEBASE spec", var3);
  215.          }
  216.       }
  217.  
  218.       URL var9 = var0;
  219.  
  220.       try {
  221.          var9 = new URL(var3);
  222.          var1.put("codebase", var3);
  223.       } catch (MalformedURLException var6) {
  224.       }
  225.  
  226.       return var9;
  227.    }
  228.  
  229.    static URL computeArchive(URL var0, Hashtable var1, Hashtable var2) {
  230.       String var3 = (String)var1.get("codebase");
  231.       URL var4 = null;
  232.       String var5 = (String)var2.get("archive");
  233.       if (var5 != null) {
  234.          var2.remove("archive");
  235.  
  236.          try {
  237.             int var6 = var5.indexOf(44);
  238.             if (var6 != -1) {
  239.                var5 = var5.substring(0, var6);
  240.             }
  241.  
  242.             URL var7 = new URL(var0, var5);
  243.             var5 = var7.toString();
  244.          } catch (MalformedURLException var9) {
  245.          }
  246.  
  247.          if (!var3.startsWith("file:") && var5.startsWith("file:")) {
  248.             throw new AppletSecurityException("EmbeddedObject: Can't use file:// URL in ARCHIVE spec", var5);
  249.          }
  250.  
  251.          try {
  252.             var4 = new URL(var5);
  253.             var1.put("archive", var5);
  254.          } catch (MalformedURLException var8) {
  255.          }
  256.       }
  257.  
  258.       return var4;
  259.    }
  260.  
  261.    static void startObject(int var0, int var1, int var2) {
  262.       EmbeddedObject var3 = EmbeddedProgramTaskOwner.findBeanOrProgram(var0, var1);
  263.       if (var3 != null) {
  264.          var3.frameContext = var2;
  265.          var3.frameContext = var2;
  266.          var3.task.addEvent(new CommandEvent(var3, "start", (Object)null));
  267.       }
  268.    }
  269.  
  270.    static void stopObject(int var0, int var1, int var2) {
  271.       EmbeddedObject var3 = EmbeddedProgramTaskOwner.findBeanOrProgram(var0, var1);
  272.       if (var3 != null) {
  273.          var3.frameContext = var2;
  274.          var3.stopObject();
  275.       }
  276.    }
  277.  
  278.    void stopObject() {
  279.       this.task.addEvent(new CommandEvent(this, "stop", (Object)null));
  280.    }
  281.  
  282.    static void destroyObject(int var0, int var1) {
  283.       EmbeddedObject var2 = EmbeddedProgramTaskOwner.findBean(var0, var1);
  284.       if (var2 != null) {
  285.          var2.destroyObject();
  286.       }
  287.  
  288.    }
  289.  
  290.    void destroyObject() {
  291.       EmbeddedObject var1 = unregisterBean(this);
  292.       this.task.addEvent(new CommandEvent(this, "destroy", (Object)null));
  293.       if (var1.beans.count() == 0) {
  294.          if (var1.taskOwner.count() > 1) {
  295.             var1.taskOwner.removeProgram(var1);
  296.             var1.task.addEvent(new CommandEvent(var1, "destroy", (Object)null));
  297.             return;
  298.          }
  299.  
  300.          if (var1.taskOwner.programOwner.programCanShutdown(this.programTracker)) {
  301.             var1.taskOwner.removeProgram(var1);
  302.             Task.unregisterTask(var1.task);
  303.             var1.task.addEvent(new CommandEvent(var1, "destroy", (Object)null));
  304.          }
  305.       }
  306.  
  307.    }
  308.  
  309.    void createApplication() {
  310.       if (this.className == null) {
  311.          this.task = Task.taskNamed(this.codebaseURL, this.programName);
  312.          this.taskOwner = (EmbeddedProgramTaskOwner)this.task.taskOwner();
  313.          this.className = this.taskOwner.getCurrentProgram().className;
  314.          this.taskOwner.addProgram(this);
  315.          this.task.addEvent(new CommandEvent(this, "init", (Object)null));
  316.          if (this.objectType != 3) {
  317.             this.task.addEvent(new CommandEvent(this, "callMochaOnLoad", (Object)null));
  318.          }
  319.       } else {
  320.          this.taskOwner = new EmbeddedProgramTaskOwner(this);
  321.          this.task = new Task(this.programName, this.className, this.codebaseURL, this.archiveURL, this.taskOwner);
  322.          this.task.start();
  323.          this.task.addEvent(new CommandEvent(this, "init", (Object)null));
  324.       }
  325.  
  326.       this.beans = new IntTable();
  327.    }
  328.  
  329.    EmbeddedObject(int var1, int var2, int var3, int var4, URL var5, URL var6, URL var7, int var8, int var9, String var10, String var11, Hashtable var12, Hashtable var13, int var14) {
  330.       if (var14 == 0) {
  331.          this.beanTracker = new EmbeddedBeanTracker(this);
  332.       } else {
  333.          this.programTracker = new EmbeddedProgramTracker(this);
  334.       }
  335.  
  336.       this.parentContext = var1;
  337.       this.frameContext = var2;
  338.       this.contextID = var3;
  339.       this.objectID = var4;
  340.       this.documentURL = var5;
  341.       this.codebaseURL = var6;
  342.       this.archiveURL = var7;
  343.       this.width = var8;
  344.       this.height = var9;
  345.       this.programName = var10;
  346.       this.className = var11;
  347.       this.attribs = var12;
  348.       this.params = var13;
  349.       this.objectType = var14;
  350.       if (var14 != 0) {
  351.          this.createApplication();
  352.       } else {
  353.          this.task = Task.taskNamed(var6, var10);
  354.          this.taskOwner = (EmbeddedProgramTaskOwner)this.task.taskOwner();
  355.          this.frame = new EmbeddedObjectFrame(this);
  356.          this.frame.pack();
  357.          this.frame.show();
  358.          registerBean(this);
  359.          this.task.addEvent(new CommandEvent(this, "init", (Object)null));
  360.       }
  361.    }
  362.  
  363.    EmbeddedObject(URL var1, String var2, String var3, String var4) {
  364.       this.programTracker = new EmbeddedProgramTracker(this);
  365.       this.codebaseURL = var1;
  366.       this.documentURL = var1;
  367.       this.archiveURL = var1;
  368.       this.programName = var2;
  369.       this.className = var3;
  370.       this.attribs = new Hashtable();
  371.       this.params = new Hashtable();
  372.       if (var4 != null) {
  373.          this.params.put("embedded owner", var4);
  374.       }
  375.  
  376.       this.objectType = 3;
  377.       this.createApplication();
  378.    }
  379.  
  380.    synchronized void setState(int var1) {
  381.       switch (var1) {
  382.          case 1:
  383.             if (this.state != 0) {
  384.                throw new InconsistencyException("Invalid state change.");
  385.             }
  386.             break;
  387.          case 2:
  388.             if (this.state != 1 && this.state != 3) {
  389.                throw new InconsistencyException("Invalid state change.");
  390.             }
  391.             break;
  392.          case 3:
  393.             if (this.state != 2) {
  394.                throw new InconsistencyException("Invalid state change.");
  395.             }
  396.             break;
  397.          case 4:
  398.             if (this.objectType == 0) {
  399.                if (this.state != 3) {
  400.                   throw new InconsistencyException("Invalid state change.");
  401.                }
  402.             } else if (this.state == 4) {
  403.                throw new InconsistencyException("Invalid state change.");
  404.             }
  405.       }
  406.  
  407.       this.state = var1;
  408.    }
  409.  
  410.    public void performCommand(String var1, Object var2) {
  411.       if ("init".equals(var1)) {
  412.          this.init();
  413.       } else if ("start".equals(var1)) {
  414.          this.start();
  415.       } else if ("stop".equals(var1)) {
  416.          this.stop();
  417.       } else if ("destroy".equals(var1)) {
  418.          this.destroy();
  419.       } else if ("callMochaOnLoad".equals(var1)) {
  420.          EmbeddedObjectNatives.pMochaOnLoad(this.frameContext, 0);
  421.       } else {
  422.          throw new InconsistencyException("unknown command: " + var1);
  423.       }
  424.    }
  425.  
  426.    void init() {
  427.       this.setState(1);
  428.       if (this.objectType != 0) {
  429.          if (this.taskOwner.programOwner != null) {
  430.             return;
  431.          }
  432.  
  433.          this.taskOwner.programOwner = defaultProgramOwner;
  434.          this.taskOwner.beanOwner = defaultBeanOwner;
  435.       } else {
  436.          this.beanOwner = this.taskOwner.beanOwner;
  437.       }
  438.  
  439.       String var1 = (String)this.params.get("embedded owner");
  440.       if (var1 != null) {
  441.          Class var3;
  442.          try {
  443.             var3 = this.task.loadClass(var1);
  444.          } catch (ClassNotFoundException var7) {
  445.             throw new InconsistencyException("Unable to load class: " + var1);
  446.          }
  447.  
  448.          Object var2;
  449.          try {
  450.             var2 = var3.newInstance();
  451.          } catch (InstantiationException var5) {
  452.             throw new InconsistencyException("Bag things...");
  453.          } catch (IllegalAccessException var6) {
  454.             throw new InconsistencyException("Bag things...");
  455.          }
  456.  
  457.          if (this.objectType != 0) {
  458.             boolean var4 = false;
  459.             if (var2 instanceof EmbeddedProgramOwner) {
  460.                this.taskOwner.programOwner = (EmbeddedProgramOwner)var2;
  461.                var4 = true;
  462.             }
  463.  
  464.             if (var2 instanceof EmbeddedBeanOwner) {
  465.                this.taskOwner.beanOwner = (EmbeddedBeanOwner)var2;
  466.                var4 = true;
  467.             }
  468.  
  469.             if (!var4) {
  470.                System.err.println("Error: " + var1 + " does not implement EmbeddedBeanOwner or EmbeddedProgramOwner interfaces.");
  471.                System.err.println("       Using default owners. ");
  472.             }
  473.          } else if (var2 instanceof EmbeddedBeanOwner) {
  474.             this.beanOwner = (EmbeddedBeanOwner)var2;
  475.          } else {
  476.             System.err.println("Error: " + var1 + " does not implement EmbeddedBeanOwner interface.");
  477.             System.err.println("       Using default owner. ");
  478.          }
  479.       }
  480.  
  481.       if (this.objectType == 0) {
  482.          this.beanOwner.embeddedBeanDidInit(this.beanTracker);
  483.       } else if (!this.taskOwner.programInitialized) {
  484.          this.taskOwner.programOwner.programDidInit(this.programTracker);
  485.          this.taskOwner.programInitialized = true;
  486.       }
  487.  
  488.       if (this.objectType == 1 || this.objectType == 0) {
  489.          EmbeddedObjectNatives.pMochaOnLoad(this.frameContext, 0);
  490.       }
  491.  
  492.    }
  493.  
  494.    void start() {
  495.       this.setState(2);
  496.       if (this.objectType == 0) {
  497.          this.beanOwner.embeddedBeanDidStart(this.beanTracker);
  498.       }
  499.  
  500.    }
  501.  
  502.    void stop() {
  503.       this.setState(3);
  504.       if (this.objectType == 0) {
  505.          this.beanOwner.embeddedBeanDidStop(this.beanTracker);
  506.       }
  507.  
  508.    }
  509.  
  510.    void destroy() {
  511.       this.setState(4);
  512.       if (this.objectType == 0) {
  513.          this.beanOwner.embeddedBeanDidDestroy(this.beanTracker);
  514.          this.frame.getComponents();
  515.          this.frame.hide();
  516.          this.frame.dispose();
  517.          this.frame.destroy();
  518.       } else {
  519.          this.task.application().stopRunning();
  520.       }
  521.    }
  522.  
  523.    static {
  524.       defaultProgramOwner = (EmbeddedProgramOwner)defaultBeanOwner;
  525.    }
  526. }
  527.